package CelcatTempDbGeneration;

/*
 * Auteurs : Manu et Cyril
 * Version : 1.0
 * Date : 29/06/2011
 * Description : Cette classe regroupe un ensemble de m�thode permettant de creer une 
 * 				base de donnees SQLite a partir d'un fichier csv
 */
import java.io.*;
import java.sql.*;
import java.util.ArrayList;

import org.sqlite.SQLite;


public class GenerateTempDB {
	
	private Connection m_con;
	
	/* 
	 * Constructeur: Creer une base de donnees temporaire initialise dans 
	 * l'attribut m_com de la classe
	 */
	public GenerateTempDB ()
	{
		try
		{
			Class.forName("org.sqlite.JDBC");
		    m_con =DriverManager.getConnection("jdbc:sqlite::memory:");
		    File db = new File("db\\celcat.dump.sql");
			CreateDbFromFile(db.getAbsolutePath());
		}
		catch(Exception e)
		{
			System.out.println("--- EXCEPTION CONSTRUCTEUR--- "+e.toString());
		}
	}

	/*
	 * Get de la base SQLite
	 */
	public Connection getBase()
	{
		return m_con;
	}
	
	/*
	 * parsing du csv pour mis en base SQLITE
	 */
	public void ParseCsvToSql(String p_file)
	{
		String tableName="";
		BufferedReader brTemp;
		//lecture du fichier texte	
		try{
			InputStream ips=new FileInputStream(p_file); 
			InputStreamReader ipsr=new InputStreamReader(ips);
			BufferedReader br=new BufferedReader(ipsr);
			String ligne;
			while ((ligne=br.readLine())!=null)
			{
				
				if(!ligne.equals(""))
				{
					if(ligne.substring(0, 3).equals("CT_") && !ligne.contains(","))
					{
						//new table : ligne avec le nom de la table
						tableName=ligne;
						ligne=br.readLine();
						
					}
					else 
					{
						//cas special pour la table ct_event
						if(tableName.equals("CT_EVENT"))
						{
							while(!ligne.equals(""))
							{
								
								String id=ligne.substring(0,ligne.indexOf(","));
								ArrayList<String> tableValue = parseCsvLine(ligne.replace("\'","''"));
								InsertTable(tableName, tableValue);
								ligne=br.readLine();
								do{
									//cas ou on a des lignes dans ct_event qui commence par des virgule
									String tempLine= ligne.substring(18);
									String tempTableName="";
									ArrayList<String> tableTempValue = parseCsvLine(tempLine.replace("\'","''"));
									
									if(tableTempValue.get(0).equals("Group"))
										tempTableName="CT_EVENT_GROUP";
									else if (tableTempValue.get(0).equals("Room"))
										tempTableName="CT_EVENT_ROOM";
									else if (tableTempValue.get(0).equals("Module"))
										tempTableName="CT_EVENT_MODULE";
									else if (tableTempValue.get(0).equals("Staff"))
										tempTableName="CT_EVENT_STAFF";
									else 
									{
										System.out.println("CSV PARSING ERROR CT_EVENT MAUVAISE CORRESPONDANCE TABLE "+tableTempValue.get(0));
									}
									tableTempValue.set(0,id);
									InsertTable(tempTableName, tableTempValue);
									ligne=br.readLine();
							
								}
								while (ligne.startsWith(","));
							}
								
						}
						else
						{
							//autre tables 
							if(ligne.lastIndexOf(",")==ligne.length()-1)
								ligne+=" ";
							ArrayList<String> tableValue = parseCsvLine(ligne.replace("\'","''"));
							InsertTable(tableName, tableValue);
						}
						
					}	
				}
			}
			br.close();
			
		}		
		catch (Exception e){
			System.out.println("---PARSE CSV ERROR---- "+e.toString());
		}
	}
	
	/*
	 * Insertion de données dans les tables
	 */
	private void InsertTable(String p_tableName,ArrayList<String> p_tableValues) 
	{
		String sqlParam="(";
		try
		{
			
			for (int i=0;i<p_tableValues.size();i++)
		    {
		    	sqlParam+="'"+p_tableValues.get(i)+"',";
		    }
		    sqlParam+=")";
		    //supression de la derni�re virgule
		    sqlParam=sqlParam.replace(",)",")");
		    Statement stat = m_con.createStatement();
		    stat.executeUpdate("insert into "+p_tableName+" values "+sqlParam+ ";");
		    
		}
		catch (SQLException sqlE)
		{
			System.out.println("---INSERT TABLE SQL ERROR---- "+sqlE.toString()+" "+sqlParam);
		}
		catch (Exception E)
		{
			System.out.println("---INSERT TABLE OTHER ERROR "+E.toString());
		}
	}
	
	/* Parse une ligne d'un fichier csv (virgule en delimiteur) dans une ArrayList
	 * L'origine de la creation de cette methode est la presence de virgule dans des 
	 * champs du fichier csv delimite par des quotes
	 */
	private ArrayList<String> parseCsvLine(String line)
	{
		ArrayList<String> returnArray = new ArrayList<String>();
		boolean quote= false;
		int i=0;
		String temp="";
		try
		{
			while(true)
			{
				char c=line.charAt(i);
				if (c==',' && !quote)
				{
					returnArray.add(temp);
					temp="";
					if(line.charAt(i+1)=='"')
					{
							quote=true;
							
							i++;
					}
				}
				else if(c=='"')
					quote=false;
				else 
					temp+=c;
				i++;
			}
		}
		catch (IndexOutOfBoundsException e)
		{
			//sortie du while
			returnArray.add(temp);
		}
		return returnArray;
	}
	
	/* Cree l'architecture de la base de donnees a partir d'un fichier dump sql
	 * passe en argument
	 */
	private void CreateDbFromFile(String p_file)
	{		
		try{
			
			InputStream ips=new FileInputStream(p_file); 
			InputStreamReader ipsr=new InputStreamReader(ips);
			BufferedReader br=new BufferedReader(ipsr);
			String ligne="";
			String file="";
			
			while ((ligne=br.readLine())!=null)
			{
				file+=ligne;
			}
			String [] tabCreateDB = file.split(";");
			for (int i =0; i<tabCreateDB.length;i++)
			{
				Statement stat = m_con.createStatement();
				stat.executeUpdate(tabCreateDB[i]);
			}
		}
		catch (SQLException sqlEx)
		{
			System.out.println("---CREATE DB SQL EXCEPTION---"+sqlEx.toString());
		}
		catch(Exception fileEx)
		{
			System.out.println("---CREATE DB OTHER EXCEPTION---"+fileEx.toString());
		}	
	}
}
